package org.example.test;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/**
 * 订阅器类
 * @param <T>
 */
public class SubscribePublish<T> {
    private String name;//订阅器名称
    final int QUEUE_CAPACITY = 20;
    private BlockingQueue<Msg> queue = new ArrayBlockingQueue<Msg>(QUEUE_CAPACITY);
    private List<ISubcriber> subcribers = new ArrayList<ISubcriber>();

    public SubscribePublish(String name) {
        this.name = name;
    }

    public void publish(String publisher,T message,boolean isInstantMsg) {
        if(isInstantMsg){
            update(publisher,message);
            return;
        }
        Msg<T> m = new Msg<T>(publisher,message);
        if(!queue.offer(m)){
            update();
        }
    }

    /**
     * @Description: 订阅
     * @param subcriber
     * @return: void
     * @author: leijing
     * @date: 2016年9月29日 下午5:18:43
     */
    public void subcribe(ISubcriber subcriber) {
        subcribers.add(subcriber);
    }

    /**
     * @Description: 退订
     * @param subcriber
     * @return: void
     * @author: leijing
     * @date: 2016年9月29日 下午5:18:43
     */
    public void unSubcribe(ISubcriber subcriber) {
        subcribers.remove(subcriber);
    }

    /**
     * @Description: 发送存储队列所有消息
     * @return: void
     * @author: leijing
     * @date: 2016年9月29日 下午5:20:33
     */
    public void update(){
        Msg m = null;
        while((m = queue.peek())!= null){
            this.update(m.getPublisher(),(T)m.getMsg());
        }
    }

    /**
     * @Description: 发送消息
     * @param publisher
     * @param Msg
     * @return: void
     * @author: leijing
     * @date: 2016年9月29日 下午5:14:29
     */
    public void update(String publisher,T Msg) {
        for(ISubcriber subcriber:subcribers){
            subcriber.update(publisher,Msg);
        }
    }
}

